/*
 *  您可以更改此项目但请不要删除作者署名谢谢，否则根据中华人民共和国版权法进行处理.
 *  You may change this item but please do not remove the author's signature,
 *  otherwise it will be dealt with according to the Copyright Law of the People's Republic of China.
 *
 *  yangbuyi Copyright (c) https://yby6.com 2024.
 */

import axios from 'axios';
import { ElMessage } from 'element-plus';
import { tansParams } from "@/utils/ystool.js";
import cache from "@/plugins/cache.js";

// 创建axios实例
const service = axios.create({
  baseURL: '/yby6-agent-api', // 部署 api 的 base_url
  timeout: 200000000 // 请求超时时间
});


// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // const isToken = (config.headers || {}).isToken === false;
    // 是否需要防止数据重复提交
    const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
    // if (getToken() && !isToken) {
    //   config.headers['Authorization'] = 'Bearer ' + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
    // }
    // get请求映射params参数
    if (config.method === 'get' && config.params) {
      let url = config.url + '?' + tansParams(config.params);
      url = url.slice(0, -1);
      config.params = {};
      config.url = url;
    }

    if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
      const requestObj = {
        url: config.url,
        data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
        time: new Date().getTime()
      };
      const sessionObj = cache.session.getJSON('sessionObj');
      if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
        cache.session.setJSON('sessionObj', requestObj);
      } else {
        const s_url = sessionObj.url; // 请求地址
        const s_data = sessionObj.data; // 请求数据
        const s_time = sessionObj.time; // 请求时间
        const interval = 500; // 间隔时间(ms)，小于此时间视为重复提交
        if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
          const message = '数据正在处理，请勿重复提交';
          console.warn(`[${ s_url }]: ` + message);
          return Promise.reject(new Error(message));
        } else {
          cache.session.setJSON('sessionObj', requestObj);
        }
      }
    }
    // FormData数据去请求头Content-Type
    if (config.data instanceof FormData) {
      delete config.headers['Content-Type'];
    }
    return config;
  },
  (error) => {
    console.log(error);
    return Promise.reject(error);
  }
);

// response 拦截器
service.interceptors.response.use(
  (response) => {
    const res = response.data;
    // 视频流
    if (response.data.type === 'application/octet-stream') {
      return response.data;
    } else if (res.code === 201 || res.code === 200) {
      // 201 表示请求成功自定义处理问题
      return response.data;
    } else {
      ElMessage({
        message: res.message || res.msg,
        type: 'error',
        duration: 5 * 1000
      });
      return Promise.reject('error');
    }
  },
  (error) => {
    ElMessage({
      message: error.code === 'ERR_BAD_RESPONSE' ? '服务器无法响应!' : error.message || error.msg,
      type: 'error',
      duration: 5 * 1000
    });
    return Promise.reject(error);
  }
);

export default service;
